package cn.dai.test;

import org.junit.Test;

import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
import java.util.Date;
import java.util.concurrent.TimeUnit;


public class DateTest {

    // java.util.Date
    @Test
    public void utilDate(){

        // 空参构造表示现在时间
        java.util.Date date = new java.util.Date();

        // 默认的CST时间格式  date.toString() -> Fri Jun 05 16:21:55 CST 2020
        System.out.println(date);

        // long类型表示以一个毫秒值来注入，表示一个指定的时间  Wed Jan 14 13:33:55 CST 1970
        java.util.Date unknow_Time= new java.util.Date(1143235345l);
        System.out.println(unknow_Time);

        // 返回java.util.Date对象的表示的时间的毫秒值
        long time = date.getTime();

        // 系统类也可以获取这个毫秒值
        long currentTimeMillis = System.currentTimeMillis();
        System.out.println("日期对象的毫秒值 " + time + "系统类的毫秒值 " + currentTimeMillis);
    }

    // 时间戳类 java.time.Instant
    @Test
    public void timeInstant(){

        // 实例的创建
        java.util.Date date = new java.util.Date();
        java.time.Instant instant = date.toInstant();

        Instant now = Instant.now();

        // 时间偏移问题：
        System.out.println(date); // Fri Jun 05 16:38:14 CST 2020
        System.out.println(instant); // 2020-06-05T08:38:14.721Z 可以发现这个实例会少8个小时，时间格式是ISO-8601

        System.out.println(Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8)));// 增加8小时,只能在初始化的时候进行调用才会有效

        // 得到毫秒值
        long epochMilli = instant.toEpochMilli();
    }

    // java.text.SimpleDateFormat
    @Test
    public void simpleDateFormat(){
        // 将Date对象转换成文本的时间格式

        //创建一个格式模板对象
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
        // 对日期对象进行转换
        String noArgFormat = simpleDateFormat.format(new Date());
        System.out.println(noArgFormat); // 20-6-5 下午4:49

        // 对文本时间格式只能在构造器中进行注入
        SimpleDateFormat diyFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String diyFormatTime = diyFormat.format(new Date());
        System.out.println(diyFormatTime); // 2020-06-05 16:53:22
    }

    // java.sql.Date
    @Test
    public void sqlDate(){
        // sqlDate初始化必须需要一个long的毫秒值
        java.sql.Date date = new java.sql.Date(System.currentTimeMillis());

        // sqlDate用于给数据库的时间类型匹配

        // 这两者的Date对象转换都依靠于毫秒值实现

        // SQL_DATE -> UTIL_DATE
        java.util.Date util_date = new java.util.Date(date.getTime());
        // UTIL_DATE -> SQL_DATE
        java.sql.Date sql_date = new java.sql.Date(util_date.getTime());
    }

    // java.time.Local*
    @Test
    public void localAbout(){
        // 初始化
        LocalDate now1 = LocalDate.now();
        LocalTime now2 = LocalTime.now();
        LocalDateTime now3 = LocalDateTime.now();

        System.out.println("LocalDate.now() -> " + now1);
        System.out.println("LocalTime.now() -> " + now2);
        System.out.println("LocalDateTime.now() -> " + now3);

        /*
        LocalDate.now() -> 2020-06-05
        LocalTime.now() -> 17:07:20.962
        LocalDateTime.now() -> 2020-06-05T17:07:20.962

        三者几乎都是一样的方法
        */

        // LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("localDateTime.getDayOfWeek() -> " + localDateTime.getDayOfWeek() );     // getDayOfWeek() 按周算天
        System.out.println("localDateTime.getDayOfMonth() -> " + localDateTime.getDayOfMonth() );   // getDayOfMonth() 按月算天
        System.out.println("localDateTime.getDayOfYear() -> " + localDateTime.getDayOfYear() );     // getDayOfYear() 按年算天
        /*
            localDateTime.getDayOfWeek() -> SUNDAY
            localDateTime.getDayOfMonth() -> 19
            localDateTime.getDayOfYear() -> 110
         */
        System.out.println( localDateTime.getSecond()       );// getSecond() 取秒
        System.out.println( localDateTime.getMinute()       );// getMinute() 取分
        System.out.println( localDateTime.getHour()         );// getHour() 取时
        System.out.println( localDateTime.getMonth()        );// getMonth() 取月 英文大写
        System.out.println( localDateTime.getMonthValue()   );// getMonthValue() 取月 数值表示
        System.out.println( localDateTime.getYear()         );// getYear() 取年
    }

    // java.time.format.DateTimeFormatter
    @Test
    public void dateTimeFormatter(){
        // 预定义的标准格式
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

        // 事件对象
        LocalDateTime now = LocalDateTime.now();

        // 转换格式 日期 -> 字符串格式
        String format = dateTimeFormatter.format(now);

        // 格式
        System.out.println( now );
        System.out.println( format );

        // 日期 转 字符串格式
        TemporalAccessor parse = dateTimeFormatter.parse("2020-03-19T22:09:46.345");
        System.out.println(parse);

        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
        // ofLocalizedDateTime();
        // ofLocalizedDate(); 按Date就支持FULL全格式
        // ofPattern("自定义格式"); "yyyy-MM-dd hh:mm:ss"

        // FormatStyle.FULL     2020年4月19日 星期日
        // FormatStyle.LONG     2020年4月19日 下午10时15分01秒
        // FormatStyle.MEDIUM   2020-4-19 22:14:28
        // FormatStyle.SHORT    20-4-19 下午10:16

        String format1 = dateTimeFormatter1.format(now);
        System.out.println(now);
        System.out.println(format1);

        TemporalAccessor parse1 = dateTimeFormatter1.parse(format1);
        System.out.println(parse1);
    }
}
